#ifndef PHNQLET_H_
#define PHNQLET_H_

#include <string>
#include <map>
#include <set>
#include <boost/thread/mutex.hpp>
#include "I18nStringsBundle.h"
#include "kit.h"

using namespace std;

namespace phnq
{
	namespace phnqlets
	{
		class Template;
		
		class PhnqletConfig : public phnq::kit::xml::SAXHelperDelegate
		{
			public:
				void startTag(string name, string path, map<string,string> attrs);
			
			private:
				friend class Phnqlet;
				string type;
				string title;
				string alias;
				string extends;
				set<string> deps;
		};
	
		class Phnqlet
		{
			public:
				Phnqlet(string dir);
				~Phnqlet();
				string getType();
				string getAlias();
				Phnqlet* getSuper();
				int getIndex();
				string getDir();
				string getScriptFile();
				string getScript();
				string getScript(bool &hasScriptFile);
				string getStyleFile();
				string getStyle();
				string getRelativePath(string path);
				Template* getTemplate(string name);
				I18nStringsBundle* getStrings();
				set<Phnqlet*> getExplicitDependencies();
			
			private:
				string dir;
				string cacheKey;
				PhnqletConfig config;
				int index;
			    boost::mutex initTmpltsMutex;
				bool tmpltsInited;
				void initConfig();
				void initTemplatesIfNeeded();
				map<string,Template*> templates;
				I18nStringsBundle *i18nStrings;
		};
	}
}

#endif // PHNQLET_H_
